package com.rw.tool.util.basic;

import java.util.ConcurrentModificationException;
import java.util.Iterator;

/**
 * 位数组迭代器
 */
public class BitArrayIterator implements Iterator<Boolean> {
    /**
     * 除以8的移数
     */
    private static final int DIV_BY_EIGHT_SHIFT = 3;

    /**
     * 模8的掩码
     */
    private static final int MOD_BY_EIGHT_AND = 0b111;

    /**
     * 字节数组
     */
    private final byte[] byteArr;

    /**
     * 一开始的数组长度
     */
    private final int startLength;

    /**
     * 位数组长度
     */
    private final int size;

    /**
     * 迭代到的位置
     */
    private int index;

    /**
     * 新建迭代器
     *
     * @param byteArr 字节数组
     * @param size    位数组长度
     */
    public BitArrayIterator(byte[] byteArr, int size) {
        this.byteArr = byteArr;
        this.startLength = byteArr.length;
        this.size = size;
        this.index = 0;
    }

    /**
     * 是否有下一个数
     *
     * @return 是否有
     */
    @Override
    public boolean hasNext() {
        return index < size;
    }

    /**
     * 下一个数
     *
     * @return 下一个二进制
     */
    @Override
    public Boolean next() {
        checkForModification();

        int position = index >> DIV_BY_EIGHT_SHIFT;
        int mod = index & MOD_BY_EIGHT_AND;

        boolean bit = ByteUtil.hasBit(byteArr[position], mod);
        index++;
        return bit;
    }

    /**
     * 检查是否有快速失败异常
     */
    public void checkForModification() {
        if (startLength != byteArr.length) {
            throw new ConcurrentModificationException();
        }
    }
}